import axios from 'axios'
import router from '@/router'

// 引入弹框
import { Message } from 'element-ui'
// 引入vuex
import store from '@/store'
import { getTimeStamp } from '@/utils/auth'
// 创建实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000
})

// 请求拦截器
// 在每一个请求headers带上token (如果请求本身没有,但是数据上有token)

// 请求拦截器 在每个请求 headers 带上 token (如果请求本身没有带, 但是数据中有 token)
service.interceptors.request.use(config => {
  // 如果请求本身没有带上 token 但是 vuex 里面存在, 就应该默认注入
  if (!config.headers.Authorization && store.getters.token) {
    // 有token的同时,不超过了是定的时间久可以继续进行下面的步骤

    // 主动处理 token 过期
    if (!isTimeOut()) {
      // 这里是 JWT 鉴权标准的 Bearer Token 规范
      // 格式是: 'Bearer xxxxxx'
      config.headers.Authorization = `Bearer ${store.getters.token}`
    } else {
      // 超出了有效的登录时间范围
      // 清空数据
      store.dispatch('user/logout')
      // 跳转到登录页
      router.push('/login')
      // 弹框
      return Promise.reject(new Error('登录已过期'))
    }
  }
  return config
}, err => {
  // 防御性编程, 处理可能出现的报错
  Message.error(err.message)

  return Promise.reject(new Error(err.message))
})

// 响应拦截器
service.interceptors.response.use(
  // 响应拦截器可以接受两个函数:一个处理成功,一个处理失败

  // 处理成功
  res => {
    // 将获取的数据赋值给一个对象再进行拆分,可以直接使用里面的数据
    const { success, message, data } = res.data
    if (success) {
      // 直接返回数据
      return data
    } else {
      // 失败以后弹出提示然后停止这个请求
      Message.error(message)
      // 不能直接返回数据,因为请求以为成功了,需要返回一个拒绝的 promise 走 catch 流程
      return Promise.reject(new Error(message))
    }
  }, err => {
    // 被动处理token 失效

    // 失败处理
    // 防御性编程,处理可能出现的报错
    // console.log(err)
    // 这里是网络问题导致失败和token失效
    // token失效是的code为10002,则进行跳转到首页
    if (err.response && err.response.data && err.response.data.code === 10002) {
      // 数据清除
      store.dispatch('user/logout')
      // 跳转到登录页
      router.push('/login')
    } else {
      // 报错
      Message.error(err.message)
    }
    return Promise.reject(new Error(err.message))
  }
)
// 设定最大的登录有效期
const TimeOutDuration = 50000
// 设定判断时间差的函数
function isTimeOut() {
  const currentTime = Date.now() // 获取当前时间
  const timeStamp = getTimeStamp() // 获取登录是的时间戳
  // console.log(currentTime, '---', timeStamp)
  const time = (currentTime - timeStamp) / 1000 > TimeOutDuration
  // console.log(time)
  return time
}
export default service
